# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 10:15:45 2021

@author: ggy
"""
#【例13.1】车牌字符图像的定位与剪切

import cv2
import imutils
import numpy as np

img = cv2.imread('D:\pics\qwer.jpg',cv2.IMREAD_COLOR)
#img = cv2.imread('D:\pics\carlp1.jpg',cv2.IMREAD_COLOR)
img = cv2.resize(img, (640,480) )    #将图像调整为640x480的大小。
cv2.imshow('Origin image',img)

img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)       #将彩色图像转换为灰度图像。
img_gray = cv2.bilateralFilter(img_gray, 13, 15, 15)   #双边滤波,平滑图像保留边缘

img_edged = cv2.Canny(img_gray, 30, 200)#用Canny边缘检测算法检测图像中的边缘。
cv2.imshow('edged image',img_edged)
# 寻找轮廓。三个输入参数：输入图像，轮廓检索方式，轮廓近似方法
img_contours = cv2.findContours(img_edged.copy(), cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
# 返回countors中的轮廓
img_contours = imutils.grab_contours(img_contours)
img_contours = sorted(img_contours, key = cv2.contourArea, reverse = True)[:10]  #排序
#print('contours',contours)
screenCnt = None

for c in img_contours:
    peri = cv2.arcLength(c, True)     #计算轮廓的周长
    approx = cv2.approxPolyDP(c, 0.018 * peri, True)  #多边形拟合曲线
    if len(approx) == 4:      #逼近后的多边形有4个顶点，则认为可能是车牌。
        screenCnt = approx
        break

if screenCnt is None:
    detected = 0
    print ("No contour detected")
else:
     detected = 1

if detected == 1:
    cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)   #原始图像上绘制检测到的车牌轮廓。

mask = np.zeros(img_gray.shape,np.uint8)#创建一个与灰度图像大小相同的黑色掩模。
new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)#在掩模上绘制检测到的车牌轮廓。
cv2.imshow('mask_image',new_image)             #找到车牌位置，并掩模
new_image = cv2.bitwise_and(img,img,mask=mask)  #使用掩模与原图像“与”操作，提取车牌区域
#cv2.imshow('bitwisenew_image',new_image)

(x, y) = np.where(mask == 255)    #找到掩模中值为255的像素坐标。
(topx, topy) = (np.min(x), np.min(y))   #找到车牌区域的最小坐标。
(bottomx, bottomy) = (np.max(x), np.max(y))   #找到车牌区域的最小坐标。
cropped = img_gray[topx:bottomx+1, topy:bottomy+1]  # 切割车牌图像
cropped = cv2.resize(cropped,(400,200))#切割出的车牌图像调整为400x200的大小。
cv2.imshow('Cropped',cropped)

cv2.waitKey(0)   #等待用户按键，参数为0表示无限等待。
cv2.destroyAllWindows()   #关闭所有OpenCV窗口。
